/*
 * **********************************************************
 * File Name: Register.c
 * Description: Register Address Deal Functions
 * NeedFile(s): Settings.h
 * **********************************************************
 */

/*
 * **********************************************************
 * Predefines
 * **********************************************************
 */

#define __APP_VERSION__

/*
 * **********************************************************
 * include files
 * **********************************************************
 */

#include "main.h"
#include "IDriver.h"
//#include "ADScan.h"
#include "Register.h"
//#include "EEPROM.h"
#include "ModbusRtu.h"
#include "ModbusRegister.h"
#include "uart.h"	
//#include "DigitalIn.h"
//#include "DigitalOut.h"
//#include "AnalogInTrans.h"
//#include "AnalogOutTrans.h"
#include "Control.h"
#include "fan_ctrl.h"
/*
 * **********************************************************
 * Private Variables
 * **********************************************************
 */
s16 InputValue[INPUT_PARA_COUNTS];
s16 HoldValue[HOLD_PARA_COUNTS];
u8 SetModbusRegistRead=0;


u8 SlaveTempControllerFaultCount = 0;
u8 SlaveLockFaultCount = 0;

#define BANK1_WRITE_START_ADDR 	((uint32_t)0x0800FC00)


u16 ModbusSlaveData[1][60];

u16 Get_ModbusSlaveData(u8 i)
{
	return ModbusSlaveData[0][i];

}
/*
 * Function Name:   Modbus_Master_Update_Holding
 * Description:  ������չ���������
 * Return Value:    ����ֵ
 * Parameter:   address �ӻ���ַ
                registerLoca ���ݵ�ַ
                registerValue ����
 * Note:
 */
u8  Modbus_Master_Update_Holding(u8 num,u8 address, u16 registerLoca, s16 registerValue)
{
		// if (address != eeprom_data.read_slave_address)
			
		//{
		//	return (u8)1;
		//}
	
	  // SetParamRegisterValue(registerLoca,registerValue);
		
      u8 index;
	   index = 0;
	   
	   
//	   for( i=0;i<10;i++)
//	   {
//	        
//	   		if(eeprom_data.ModbusMasterPara[i].SlaveAddress == address)
//	   		{
//	   			index = i;
//				break;

//			}
//			

//	   }
	   if((index < 10)&&(num < 60))
	   {
	   			ModbusSlaveData[index][num] = registerValue;
	   }

	   
//       if(index == 0)
//       {
//            
//            if (registerLoca == 0x0100)
//			{				
//			    SetQuantityOfElectrity( 0,registerValue );
//				
//			}
//			else if(registerLoca == 0x0101)
//			{
//				SetQuantityOfElectrity( 1,registerValue );
//				
//			}
//			
//       

//	   }
	   return (u8)0;

	
    
}




/*
 * Function Name:   Modbus_Master_Update_Input
 * Description:  ������չ����������
 * Return Value:    ����ֵ
 * Parameter:   address �ӻ���ַ
                registerLoca ���ݵ�ַ
                registerValue ����
 * Note:
 */
u8  Modbus_Master_Update_Input(u8 num,u8 address, u16 registerLoca, u16 registerValue)
{
   //   u8 i,index;
	 u8  index = 0xff;
	   
	   
//	   for( i=0;i<10;i++)
//	   {
//	   		if(eeprom_data.ModbusMasterPara[i].SlaveAddress == address)
//	   		{
//	   			index = i;
//				break;

//			}
//			

//	   }
	   if((index < 10)&&(num < 60))
	   {
	   			ModbusSlaveData[index][num] = registerValue;
	   }

	   
	   
	   
	   
	   
	   
	   
//       if(index == 0)
//       {
//            
//            if (registerLoca == 0x0100)
//			{				
//			    SetQuantityOfElectrity( 0,registerValue );
//				
//			}
//			else if(registerLoca == 0x0101)
//			{
//				SetQuantityOfElectrity( 1,registerValue );
//				
//			}
//			
//       

//	   }
	  
       
		 
		
		
		return (u8)0;
}

void 	 ResetModbusSlaveData(u8 address,u16 value,u8 num)
{
	u8 i;
	for(i=0;i<50;i++)
	{
	  ModbusSlaveData[address][i] = 0; 
	  if(address < 10) 
	  {	  
	    if(i < num)	  
	    {
		   ModbusSlaveData[address][i] = value;
	    }
		
	  }
	
	}
	
}




/* Function Name:   GetCircleRegisterValue
 * Description: ��ȡ��Ȧֵ
 * Return Value:    REGISTER_VALUE  ���ؼĴ���ֵ��״̬
 * Parameter:   location    �Ĵ�����ַ
 * Note:
 */
REGISTER_VALUE GetCircleRegisterValue(u16 location)
{
    REGISTER_VALUE reg;
    reg.state = 0;
/*
    if(location >= DO_CHANNEL_AMOUNT)
    {
        reg.state = 255;
        return reg;
    }
*/
        //To be revised zhouhl
    //reg.value = IGet_DO_State(DO_INDEX_0 + location);
    return reg;
}

/*
 * Function Name:   GetStatueRegisterValue
 * Description: ��ȡ����״ֵ̬
 * Return Value:    REGISTER_VALUE  ���ؼĴ���ֵ��״̬
 * Parameter:   location    �Ĵ�����ַ
 * Note:
 */
REGISTER_VALUE GetStatueRegisterValue(u16 location)
{
    REGISTER_VALUE reg;
    reg.state = 0;
/*
    if(location >= DI_CHANNEL_AMOUNT)
    {
        reg.state = 255;
        return reg;
    }
*/
        //To be revised zhouhl
    //reg.value = IGet_DI_State(DI_INDEX_0 + location);
    return reg;
}

/*
 * Function Name:   SetCircle
 * Description: ������Ȧ
 * Return Value:    u8  ����8λ�޷�������0Ϊ������1Ϊ����
 * Parameter:   location    �Ĵ�����ַ
 *              value   ����ֵ��0Ϊ�Ͽ�����0Ϊ����
 * Note:
 */
u8  SetCircle(u16 location, u8  value)
{
      //To be revised zhouhl
/*
    if(value)
    {

        return ISet_DO_Through(DO_INDEX_0 + location);
    }
    else
    {
        return ISet_DO_Break(DO_INDEX_0 + location);
    }
*/
        return 0;
}

/*
 * Function Name:   GetInputRegisterValue
 * Description: ��ȡ����Ĵ���ֵ
 * Return Value:    REGISTER_VALUE  ���ؼĴ���ֵ��״̬
 * Parameter:   location    �Ĵ�����ַ
 * Note:
 */
REGISTER_VALUE GetInputRegisterValue(u16 Address)
{
    REGISTER_VALUE reg;
    reg.state = 0;
    //reg.value = 0;
     if(Address < 1000)
    {
        reg.value =  GetJDASDStatuesValue(Address);
    }
	 else if(Address >= 1000 && Address < 1050)
	{
		reg.value = IGet_AD_Value(Address - 1000);
	}
//	else if(Address >= 1050 && Address < 1100)
//	{
//		reg.value = IGet_AI_Value(Address - 1050);
//	}
	 else if(Address >= 1100 && Address < 1150)
	{
		
		reg.value = IGet_AI_Scaled_Value(Address - 1100);
		
	}
	else if(Address >= 1150 && Address < 1200)
	{		
		if(Address >= 1166 && Address <= 1167)
		{
			reg.value = Hal_GetFanInput(Address - 1166);
		}
		else
		{
			reg.value = IGet_DI_State(Address - 1150);
		
		}
	}

  return reg;

    
}

/*
 * Function Name:   GetParamRegisterValue
 * Description: ��ȡ���ּĴ���ֵ
 * Return Value:    REGISTER_VALUE  ���ؼĴ���ֵ��״̬
 * Parameter:   location    �Ĵ�����ַ
 * Note:
 */
REGISTER_VALUE GetParamRegisterValue(u16 location)
{
    REGISTER_VALUE reg;
    reg.state = 0;
        
   if(location < 1000)
    {
				if(location < PARAM_AMOUNT)
        {   
             
			      reg.value = GetJDASDParamValue(location);			 
			
        }             
    }
   
//  storage section, 2000~2999
	else if(location >= 1000 && location <= 2000)
    {
       reg.value =  ModbusSlaveData[0][location - 1000];//IGet_AD_Source(AD_INDEX_0 + location - 2000);
		
    }
		
	#ifdef AO
//  AO Section, 5000~5999
    else if(location >= 5000 && location <= 5003)
    {
        reg.value = IGet_DA_Value(ANALOG_OUT_INDEX_0 + location - 5000);
    }
    else if(location >= 5010 && location <= 5019)
    {
       reg.value = IGet_AO_Value(ANALOG_OUT_INDEX_0 + location - 5010);
		
    }
    else if(location >= 5020 && location <= 5023)
    {
        reg.value = IGet_AO_ScaledValue(ANALOG_OUT_INDEX_0 + location - 5020);
    }
    else if(location >= 5030 && location <= 5033)
    {
        reg.value = IGet_AO_Gain(ANALOG_OUT_INDEX_0 + location - 5030);
    }
    else if(location >= 5040 && location <= 5043)
    {
        reg.value = IGet_AO_Offset(ANALOG_OUT_INDEX_0 + location - 5040);
    }
    else if(location >= 5050 && location <= 5053)
    {
        reg.value = IGet_AO_Calibration(ANALOG_OUT_INDEX_0 + location - 5050);
    }
    else if(location >= 5060 && location <= 5063)
    {
        reg.value = IGet_AO_MIN(ANALOG_OUT_INDEX_0 + location - 5060);
    }
    else if(location >= 5070 && location <= 5073)
    {
        reg.value = IGet_AO_MAX(ANALOG_OUT_INDEX_0 + location - 5070);
    }
    else if(location >= 5080 && location <= 5083)
    {
        reg.value = IGet_AO_MIN_Scaled(ANALOG_OUT_INDEX_0 + location - 5080);
    }
    else if(location >= 5090 && location <= 5093)
    {
        reg.value = IGet_AO_MAX_Scaled(ANALOG_OUT_INDEX_0 + location - 5090);
    }
	#endif
//  DI Section, 6000~6999
//    else if(location >= 6000 && location <= 6019)
//    {
//        reg.value = IGet_DI_Retry(DI_INDEX_0 + location - 6000);
//    }
     else if(location >= 6020 && location <= 6030)
    {
        reg.value = IGet_PWM_Value	( location - 6020);
    }
//  DO Section, 7000~7999
    else if(location >= 7000 && location <= 7050)
    {
        reg.value = IGet_DO_State(location - 7000);
    }
//        else if(location >= 7051 && location <= 7100)
//    {
//        reg.value = IGet_ReadTime(location - 7051);
//    }
//  Others Section, 8000~8999
//    else if(location >= 8000 && location <= 8999)
//    {
//        switch(location)
//        {
//        case 8000:
////             reg.value = IGet_Valve_AdjustPercent();
//             break;
//                   
//        case 8001:
//        case 8002:
//            reg.value = 1;
//            break;
//        case 8010:
//        case 8011:
//        case 8012:
//            reg.value = 0;
//            break;
//        case 8020:
//        case 8021:
//        case 8022:
////          reg.value = 0;
//            break;
//        case 8030:
//            reg.value = IGet_Uart_Baudrate(UART_INDEX_1);
//            break;
//        case 8031:
//            reg.value = IGet_Uart_Baudrate(UART_INDEX_2);
//            break;
//        case 8032:
//            reg.value = IGet_Uart_Baudrate(UART_INDEX_3);
//            break;
////        case 8033:
////            reg.value = IGet_Uart_Baudrate(UART_INDEX_4);
////            break;
//        case 8050:
//            reg.value = IGet_Uart_Data_Bits(UART_INDEX_1);
//            break;
//        case 8051:
//            reg.value = IGet_Uart_Data_Bits(UART_INDEX_2);
//            break;
//		case 8052:
//            reg.value = IGet_Uart_Data_Bits(UART_INDEX_3);
//            break;
////         case 8053:
////            reg.value = IGet_Uart_Data_Bits(UART_INDEX_4);
////            break;
//        case 8060:
//            reg.value = IGet_Uart_Stop_Bits(UART_INDEX_1);
//            break;
//        case 8061:
//            reg.value = IGet_Uart_Stop_Bits(UART_INDEX_2);
//            break;
//		case 8062:
//            reg.value = IGet_Uart_Stop_Bits(UART_INDEX_3);
//            break;
////		case 8063:
////            reg.value = IGet_Uart_Stop_Bits(UART_INDEX_4);
////            break;	
//        case 8070:
//            reg.value = IGet_Uart_Check_Bit(UART_INDEX_1);
//            break;
//        case 8071:
//            reg.value = IGet_Uart_Check_Bit(UART_INDEX_2);
//            break;
//        case 8072:
//            reg.value = IGet_Uart_Check_Bit(UART_INDEX_3);
//            break;                
////         case 8073:
////            reg.value = IGet_Uart_Check_Bit(UART_INDEX_4);
////            break;                  
//      
//       
//        default:
//            reg.value = 0;
//            break;
//        }
//    }
////  System Section, 9000~9999
//    else if(location == 9000)
//    {
//        reg.value = IGet_Serial_Length();
//    }
    else if(location >= 9001 && location <= 9099)
    {
        if(location - 9001 < IGet_Serial_Length())
        {
            reg.value = IGet_Serial_Char(location - 9001);
        }
        else if(location  - 9021 < IGet_Version_Length())
        {
          
            reg.value = IGet_Version(location - 9021);
        }
        else
        {
            reg.value = ' ';
        }
    }
//    else if(location == 9100)
//    {
//        reg.value = IGet_Onboard_Information(DRI_INFO_BOOTLOADER_MAGIC);
//    }
//    else if(location == 9101)
//    {
//        reg.value = IGet_Onboard_Information(DRI_INFO_NEWBOARD_FLAG);
//    }
//    else if(location == 9102)
//    {
//        reg.value = IGet_Onboard_Information(DRI_INFO_VERSION_FLAG);
//    }
//    else if(location == 9103)
//    {
//       // reg.value = IGet_Onboard_Information(DRI_INFO_CALIBRATION_STATE);
//    }
//    else if(location == 9104)
//    {
//        reg.value = IGet_SystemTest_Status();
//    }
//    
//    
//    else if(location >= 10000)
//    {   //  ������
//        reg.value = 0;//GetJD055ParallelStatuesValue(location);
//    }
    else
    {
        reg.value = 0;
    }

    return reg;

   }

   
   

   
/*
 * Function Name:   SetParamRegisterValue
 * Description: ���ñ��ּĴ���ֵ
 * Return Value:    u8  ����8λ�޷�������0Ϊ��������0Ϊ����
 * Parameter:   location    �Ĵ�����ַ
 *              value   �趨ֵ
 * Note:
 */
u8  SetParamRegisterValue(u16 location,   s16 value)
{
	//u8 ret;

	if(location < 1000)
	{
		if(location > PARAM_AMOUNT)
		{
			return 0;		  
		}

		if (value > Param_Get_MAX(location))
		{
			//value = Param_Get_MAX(location);
			return 0;
		}

		if (value < Param_Get_MIN(location))
		{
			//value = Param_Get_MIN(location);
			return 0;
		}

		if(location ==HREG_SET_DEFAULT)
		{
			if(value == 0x5ACA)
			{
				Params_Set_dafault();
			}
		}
		else
		{
			IStore_Value(location * 2,  value);            
		}
		return SetJDASDParamValue(location, value);

	}
	//	storage section, 2000~2999	
	else if(location >= 1000 && location <= 1099)
	{			
		    return  ModbusRTU_Master_WriteSlave_SingleValue(	1	,	6	,	location - 1000	,value);
	}
	
//    else if(location >= 2100 && location <= 2899)
//	{
//			return IStore_Value(location - 2000,	value);
//	}
////	else if(location >= 2900 && location <= 2999)
////	{
////			return ISet_AI_Cali_Value(ANALOG_IN_INDEX_0 + location - 2900, value);
////	}
//	else if(location >= 3000 && location <= 3029)
//	{
//		return ISet_AD_Enable(location - 3000);
//	}	
//		
	else if(location >= 3030 && location <= 3059)
	{
		  if(location == 3030)
			{
					return ISet_EXV_Value(value);
			}
	}
////	
////		else if(location >= 3060 && location <= 3099)
////		{
////			return ISet_AI_Type(ANALOG_IN_INDEX_0 + location - 3060, value);
////		}
////		else if(location >= 4000 && location <= 4199)
////		{
////			return ISet_AI_CALIBRATION(ANALOG_IN_INDEX_0 + location - 4000, value);
////		}
////		
////		
////		else if(location >= 4200 && location <= 4236)
////		{
////			return ISet_AI_MIN(ANALOG_IN_INDEX_0 + location - 4200, value);
////		}
////		else if(location >= 4250 && location <= 4286)
////		{
////			return ISet_AI_MAX(ANALOG_IN_INDEX_0 + location - 4250, value);
////		}
////		else if(location >= 4300 && location <= 4336)
////		{
////			return ISet_AI_MIN_Scaled(ANALOG_IN_INDEX_0 + location - 4300, value);
////		}
////		else if(location >= 4350 && location <= 4386)
////		{
////			return ISet_AI_MAX_Scaled(ANALOG_IN_INDEX_0 + location - 4350, value);
////		}
////		else if(location >= 4400 && location <= 4403)
////		{
////		   return  ISet_Modbus_SlaveAddress (location - 4400,	value	);
////		}
//		else if(location >= 4450 && location < 4500)
//		{
//		    return 0;//ISet_StrChannel(location - 4450);
//		}
//		
//		else if(location == 4500 )
//		{
//		    return  ISet_DACValue	(	value	);
//		}
////	    else if(location == 4550 )
////		{
////		    return  Set_TestCommFlag	(	value	);
////		}	
//		
//		#ifdef AAA	
//		else if(location >= 5000 && location <= 5003)
//		{
//			return ISet_DA_Value(ANALOG_OUT_INDEX_0 + location - 5000, value);
//		}
//		else if(location >= 5010 && location <= 5019)
//		{
//			return ISet_AO_Value(ANALOG_OUT_INDEX_0 + location - 5010, value);
//			
//		}
//		else if(location >= 5020 && location <= 5029)
//		{
//			return ISet_AO_ScaledValue(ANALOG_OUT_INDEX_0 + location - 5020, value);
//		}
//		else if(location >= 5030 && location <= 5033)
//		{
//			return ISet_AO_Gain(ANALOG_OUT_INDEX_0 + location - 5030, value);
//		}
//		else if(location >= 5040 && location <= 5043)
//		{
//			return ISet_AO_Offset(ANALOG_OUT_INDEX_0 + location - 5040, value);
//		}
//		else if(location >= 5050 && location <= 5053)
//		{
//			return ISet_AO_Calibration(ANALOG_OUT_INDEX_0 + location - 5050, value);
//		}
//		else if(location >= 5060 && location <= 5063)
//		{
//			return ISet_AO_MIN(ANALOG_OUT_INDEX_0 + location - 5060, value);
//		}
//		else if(location >= 5070 && location <= 5073)
//		{
//			return ISet_AO_MAX(ANALOG_OUT_INDEX_0 + location - 5070, value);
//		}
//		else if(location >= 5080 && location <= 5083)
//		{
//			return ISet_AO_MIN_Scaled(ANALOG_OUT_INDEX_0 + location - 5080, value);
//		}
//		else if(location >= 5090 && location <= 5093)
//		{
//			return ISet_AO_MAX_Scaled(ANALOG_OUT_INDEX_0 + location - 5090, value);
//		}
//		#endif
//	//	DI Section, 6000~6999
////		else if(location >= 6000 && location <= 6019)
////		{
////			return ISet_DI_Retry(DI_INDEX_0 + location - 6000, value);
////		}
    else if(location >= 6020 && location <= 6030)
		{
			return ISet_PWM_Value	(	location - 6020	,		value	);
		}
//	//	DO Section, 7000~7999
		else if(location >= 7000 && location <= 7030)
		{
			if(value)
			{
				return ISet_DO_Through(location - 7000);
			}
			else
			{
				return ISet_DO_Break(location - 7000);
			}
		}
//			  else if(location >= 7051 && location <= 7100)
//		{
//			return ISet_ReadTime(location - 7051,value);
//		}
//		//else if(location >= 7100 && location <= 7123)
//		//{
//		//	return SetU32ParamValue(U32_INDEX_DO_HOURS_0 + (location - 7100) / 2, location % 2, value);
//		//}
//	//	Others Section, 8000~8999
//		else if(location >= 8000 && location <= 8999)
//		{
//			switch(location)
//			{
//	        case 8000:
////                   ISet_Valve_AdjustPercent(value);
//                    break;
//	//		case 8001:
//	//		case 8002:
//	//		case 8010:
//	//		case 8011:
//	//		case 8012:
//			case 8020:
//			case 8021:
//			case 8022:
//	//			reg.value = 0;
//				break;
//			case 8030:
//				return ISet_Uart_Baudrate	(	UART_INDEX_1	,		value	);//SetU32ParamValue(U32_INDEX_BAUDRATE_0, U32PARAM_HIGH, value);
//			case 8031:
//				return ISet_Uart_Baudrate	(	UART_INDEX_2	,		value	);
//			case 8032:
//				return ISet_Uart_Baudrate	(	UART_INDEX_3	,		value	);
////			case 8033:
////				return ISet_Uart_Baudrate	(	UART_INDEX_4	,		value	);
//			case 8050:
//				return ISet_Uart_Data_Bits(UART_INDEX_1, value);
//			case 8051:
//				return ISet_Uart_Data_Bits(UART_INDEX_2, value);
//			case 8052:
//				return ISet_Uart_Data_Bits(UART_INDEX_3, value);
////			case 8053:
////				return ISet_Uart_Data_Bits(UART_INDEX_4, value);
//			case 8060:
//				return ISet_Uart_Stop_Bits(UART_INDEX_1, value);
//			case 8061:
//				return ISet_Uart_Stop_Bits(UART_INDEX_2, value);
//			case 8062:
//				return ISet_Uart_Stop_Bits(UART_INDEX_3, value);
//			case 8063:
//				return ISet_Uart_Stop_Bits(UART_INDEX_3, value);
//			case 8070:
//				return ISet_Uart_Check_Bit(UART_INDEX_1, value);
//			case 8071:
//				return ISet_Uart_Check_Bit(UART_INDEX_2, value);
//			case 8072:
//				return ISet_Uart_Check_Bit(UART_INDEX_3, value);
////		    case 8073:
////				return ISet_Uart_Check_Bit(UART_INDEX_4, value);
//			default:
//				break;
//			}
//		}
//	//	System Section, 9000~9999
		else if(location >= 9001 && location <= 9099)
		{
			if(location - 9001 < IGet_Serial_Length())
			{
				return ISet_Serial_Char(location - 9001, value);
			}
		}
//		else if(location == 9100)
//		{
//			//return ISet_Onboard_Information(DRI_INFO_BOOTLOADER_MAGIC, value);
//		}
//		else if(location == 9101)
//		{
//			//return ISet_Onboard_Information(DRI_INFO_NEWBOARD_FLAG, value);
//		}
//		else if(location == 9102)
//		{
//			//return ISet_Onboard_Information(DRI_INFO_VERSION_FLAG, value);
//		}
//		else if(location == 9103)
//		{
//			//return ISet_Onboard_Information(DRI_INFO_CALIBRATION_STATE, value);
//		}
//		  else if(location == 9104)
//		{
//			//return ISet_SystemTest_Status(value);
//		}
//		else if(location >= 10000)
//		{
//			//return SetJD055ParallelParamValue(location,	value);
//					return (u8)0;
//		}
//		else
//		{
//			return (u8)1;
//		}
		return (u8)0;
	}



